
package inc.jmc.cyberboard.dao;

import inc.jmc.cyberboard.common.NumFormat;
import inc.jmc.cyberboard.entitybeans.HistoricoVentas;
import inc.jmc.cyberboard.entitybeans.HistoricoVentasDetalle;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.apache.log4j.Logger;


/***
 *
 *
 * Module:  HistoricoVentasDao.java
 * Author:  Juan Miguel Olguin Salguero
 * Purpose: esta clase realiza operaciones de BD para la tabla CCN_HISTORICO_VENTAS y  CCN_HISTORICO_VENTAS_DETALLE
 */
public class HistoricoVentasDao
{
    public static final int QUERY_VENTA_HOY=0;
    public static final int QUERY_VENTA_POR_DIA=1;
    public static final int QUERY_VENTA_POR_PERIODO=2;
    public static final int QUERY_VENTA_MENSUAL=3;
    public static final int QUERY_VENTA_ANUAL=4;
    public static final int QUERY_ALL_RECORDS=5;
    public static final int MAX_CRITERIA=6;
    public static final int VENTA_MES_ACTUAL=7; //LO USA UNICAMENTE EL PANEL HISTORICOGRIDVENTAS
    static Logger logger = Logger.getLogger(HistoricoVentasDao.class.getName());
    
    
    
    
    
    public int addHistoricoVentas(Connection conn,HistoricoVentas recc)throws SQLException
    {
        int idSeqVentas =0;
        String insert ="insert into ccn_historico_ventas(ID_USUARIO,CANTIDAD_ITEMS,SUBTOTAL_NO_IVA,MONTO_IVA,MONTO_TOTAL,FECHA) " +
                                                 "values(?,?,?,?,?,now())";
        PreparedStatement pstmt=conn.prepareStatement(insert,Statement.RETURN_GENERATED_KEYS);
        pstmt.setInt(1,recc.getIdUsuario().intValue());
        pstmt.setInt(2,recc.getCantidadItems().intValue());
        pstmt.setFloat(3,recc.getSubtotalNoIva().floatValue());
        pstmt.setFloat(4,recc.getMontoIva().floatValue());
        pstmt.setFloat(5,recc.getMontoTotal().floatValue());
        
        
        pstmt.executeUpdate();
        ResultSet rs=pstmt.getGeneratedKeys();
        while(rs.next())
        {
            idSeqVentas = rs.getInt(1);
        }
        pstmt.close();
        rs.close();
        pstmt.close();
        recc.setIdVenta(new Integer(idSeqVentas));
        
        //ahora vamos a poner el IDVenta en todo nuestro detalle
        HistoricoVentasDetalle[] detalle=recc.getDetalle();
        for(int i=0;i<detalle.length;++i)
        {
            detalle[i].setIdVenta(new Integer(idSeqVentas));
        }
        
        ////*ahora invocamos al metodo que inserta el detalle despues de que guardamos al maestro
        addHistoricoVentasDetalle(conn,recc,idSeqVentas);
        
        return idSeqVentas;
    }
    /*
     regresa 0 si tuvo exito
     */
    private int addHistoricoVentasDetalle(Connection conn,HistoricoVentas recc,int idVenta)throws SQLException
    {
    	String fechaHoyAux=NumFormat.sdf_yyyy_MM_dd_guiones.format(new Date());
        HistoricoVentasDetalle[] detalle=recc.getDetalle();
        int ret=0;
        Statement stmt=conn.createStatement();
        for(int i=0;i<detalle.length;++i)
        {
            String insert ="INSERT INTO ccn_historico_ventas_detalle (ID_VENTA,ID_PRODUCTO,PRECIO_UNITARIO,CANTIDAD,SUBTOTAL,renta_ini,renta_fin,maquina) " +
                                                 "values(" +
                    detalle[i].getIdVenta().intValue() +
                    "," +
                    detalle[i].getIdProducto().intValue() +
                    "," +
                    detalle[i].getPrecioUnitario().floatValue() +
                    "," +
                    detalle[i].getCantidad().intValue() +
                    "," +
                    detalle[i].getSubtotal().floatValue() +
                    "," +
                    (detalle[i].getHoraInicio()!=null?"'"+fechaHoyAux+" "+detalle[i].getHoraInicio()+"'":"null") +
                    "," +
                    (detalle[i].getHoraFin()!=null?"'"+fechaHoyAux+" "+detalle[i].getHoraFin()+"'":"null") +
                    "," +
                    (detalle[i].getMaquina()!=null?"'"+detalle[i].getMaquina()+"'":"null") +
                    ")";
            logger.info("instruccion sql a ejecutar guardando una venta:");
            logger.info(insert);
            stmt.addBatch(insert);
        }
        stmt.executeBatch();
        stmt.close();
        return ret;
    
    }
    public java.util.ArrayList<HistoricoVentas> getAllVentasThisMonth(Connection conn) throws java.sql.SQLException
    {
        StringBuffer query =new StringBuffer();
         query.append("   SELECT   ");
         query.append("   V.ID_VENTA ,  ");
         query.append("   U.usuario NOMBRE,  ");
         //query.append("   DATE_FORMAT(V.FECHA, '%d/%m/%Y %T') FECHA,  ");
         query.append("   DATE_FORMAT(V.FECHA, '%d/%m/%Y') FECHA,  ");
         query.append("   V.CANTIDAD_ITEMS,  ");
         query.append("   V.SUBTOTAL_NO_IVA,  ");
         query.append("   V.MONTO_IVA,  ");
         query.append("   V.MONTO_TOTAL  ");
         query.append("   FROM   ");
         query.append("   CCN_HISTORICO_VENTAS V,  ");
         query.append("   CCN_USUARIOS U  ");
         query.append("   WHERE   ");
         query.append("   V.ID_USUARIO=U.ID_USUARIO AND  ");
         query.append("   MONTH(V.FECHA) = MONTH(NOW()) AND  ");
         query.append("   YEAR(V.FECHA)=YEAR(NOW())  ");
         query.append("   ORDER BY  ");
         query.append("   FECHA DESC  ");

        ArrayList<HistoricoVentas> arry=new ArrayList<HistoricoVentas>();
        PreparedStatement pstmt=conn.prepareStatement(query.toString());
        ResultSet rs=pstmt.executeQuery();
        while(rs.next())
        {
            HistoricoVentas rec=new HistoricoVentas();
            
            rec.setIdVenta(new Integer(rs.getInt("ID_VENTA")));
            rec.setNombreUsuario(rs.getString("NOMBRE"));
            rec.setFecha(rs.getString("FECHA"));
            rec.setCantidadItems(new Integer(rs.getInt("CANTIDAD_ITEMS")));
            rec.setSubtotalNoIva(new Float(rs.getFloat("SUBTOTAL_NO_IVA")));
            rec.setMontoIva(new Float(rs.getFloat("MONTO_IVA")));
            rec.setMontoTotal(new Float(rs.getFloat("MONTO_TOTAL")));
            arry.add(rec);
        }
        rs.close();
        pstmt.close();
        
        return arry;
    
    }
    
    
    /**
     * es la consulta que se hace en la tabla de ventas, pero restringido con un criterio WHERE
     * @param conn 
     * @param criteria Es una cadena que empieza con WHERE
     * @throws java.sql.SQLException 
     * @return 
     */
    public java.util.ArrayList<HistoricoVentas> getVentasWithCriteria(Connection conn,int criteria, String fecha1, String fecha2) throws java.sql.SQLException
    {
        StringBuffer query =new StringBuffer();
         query.append("   SELECT  ");
         query.append("   V.ID_VENTA ,  ");
         query.append("   U.usuario NOMBRE,  ");
         //query.append("   DATE_FORMAT(V.FECHA, '%d/%m/%Y %T') FECHA,  ");
         query.append("   DATE_FORMAT(V.FECHA, '%d/%m/%Y') FECHA,  ");
         query.append("   V.CANTIDAD_ITEMS,  ");
         query.append("   V.SUBTOTAL_NO_IVA,  ");
         query.append("   V.MONTO_IVA,  ");
         query.append("   V.MONTO_TOTAL  ");
         query.append("     ");
         query.append("   FROM  ");
         query.append("   CCN_HISTORICO_VENTAS V,  ");
         query.append("   CCN_USUARIOS U  ");
         query.append(prepareCriteria(criteria,fecha1,fecha2));
         logger.info("QUERY A EJECUTAR: ");
         logger.info(query);

        ArrayList<HistoricoVentas> arry=new ArrayList<HistoricoVentas>();
        PreparedStatement pstmt=conn.prepareStatement(query.toString());
        ResultSet rs=pstmt.executeQuery();
        while(rs.next())
        {
            HistoricoVentas rec=new HistoricoVentas();
            
            rec.setIdVenta(new Integer(rs.getInt("ID_VENTA")));
            rec.setNombreUsuario(rs.getString("NOMBRE"));
            rec.setFecha(rs.getString("FECHA"));
            rec.setCantidadItems(new Integer(rs.getInt("CANTIDAD_ITEMS")));
            rec.setSubtotalNoIva(new Float(rs.getFloat("SUBTOTAL_NO_IVA")));
            rec.setMontoIva(new Float(rs.getFloat("MONTO_IVA")));
            rec.setMontoTotal(new Float(rs.getFloat("MONTO_TOTAL")));
            arry.add(rec);
        }
        rs.close();
        pstmt.close();
        
        return arry;
    }
    public java.util.ArrayList getDetalleVenta(Connection conn,int idVenta) throws java.sql.SQLException
    {
        StringBuffer query =new StringBuffer();
         query.append("   SELECT  ");
         query.append("   P.NOMBRE_CORTO,  ");
         query.append("   D.PRECIO_UNITARIO,  ");
         query.append("   D.CANTIDAD,  ");
         query.append("   D.SUBTOTAL  ");
         query.append("     ");
         query.append("   FROM  ");
         query.append("   CCN_HISTORICO_VENTAS V,  ");
         query.append("   CCN_HISTORICO_VENTAS_DETALLE D,  ");
         query.append("   CCN_PRODUCTOS P,  ");
         query.append("   CCN_USUARIOS U  ");
         query.append("     ");
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO AND  ");
         query.append("   V.ID_VENTA = D.ID_VENTA AND  ");
         query.append("   P.ID_PRODUCTO = D.ID_PRODUCTO AND  ");
         query.append("   V.ID_VENTA = "+idVenta+"  ");
         query.append("     ");
         query.append("     ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("   FECHA DESC  ");
         

        ArrayList arry=new ArrayList();
        PreparedStatement pstmt=conn.prepareStatement(query.toString());
        ResultSet rs=pstmt.executeQuery();
        while(rs.next())
        {
            ArrayList arrrRecord = new ArrayList();
            arrrRecord.add(rs.getString("NOMBRE_CORTO"));
            arrrRecord.add(new Float(rs.getFloat("PRECIO_UNITARIO")));
            arrrRecord.add(new Integer(rs.getInt("CANTIDAD")));
            arrrRecord.add(new Float(rs.getFloat("SUBTOTAL")));
            arry.add(arrrRecord);
        }
        rs.close();
        pstmt.close();
        
        return arry;
    }
    String prepareCriteria(int criteria,String fecha1,String fecha2)
    {
         int dd1=0;
         int mm1=0;
         int yyyy1=0;
         int dd2=0;
         int mm2=0;
         int yyyy2=0;
         if(fecha1 != null && !fecha1.equals(""))
         {
             dd1=Integer.parseInt(fecha1.split("/")[0]);
             mm1=Integer.parseInt(fecha1.split("/")[1]);
             yyyy1=Integer.parseInt(fecha1.split("/")[2]);
         
         }
         if(fecha2 != null && !fecha2.equals(""))
         {
             dd2=Integer.parseInt(fecha2.split("/")[0]);
             mm2=Integer.parseInt(fecha2.split("/")[1]);
             yyyy2=Integer.parseInt(fecha2.split("/")[2]);
         
         }
         
         StringBuffer query =null;
         StringBuffer[] querys=new StringBuffer[HistoricoVentasDao.MAX_CRITERIA];
         query=new StringBuffer();
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO AND  ");
         query.append("     ");
         query.append("     ");
         query.append("     ");
         query.append("   DAY(V.FECHA) = DAY(NOW()) AND  ");
         query.append("   MONTH(V.FECHA) = MONTH(NOW()) AND  ");
         query.append("   YEAR(V.FECHA)=YEAR(NOW())  ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("  V.FECHA DESC  ");
         querys[HistoricoVentasDao.QUERY_VENTA_HOY]=query;
         query=new StringBuffer();
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO AND  ");
         query.append("     ");
         query.append("     ");
         query.append("     ");
         query.append("   DAY(V.FECHA) = "+dd1+" AND  ");
         query.append("   MONTH(V.FECHA) = "+mm1+" AND  ");
         query.append("   YEAR(V.FECHA)="+yyyy1+"  ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("  V.FECHA DESC  ");
         querys[HistoricoVentasDao.QUERY_VENTA_POR_DIA]=query;
         query=new StringBuffer();
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO AND  ");
         query.append("     ");
         query.append("     ");
         query.append("     ");
         query.append("   (V.FECHA > '"+yyyy1+"-"+mm1+"-"+dd1+"') AND  ");
         query.append("   (V.FECHA < '"+yyyy2+"-"+mm2+"-"+dd2+" 23:59:59')  ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("  V.FECHA DESC  ");
         querys[HistoricoVentasDao.QUERY_VENTA_POR_PERIODO]=query;
         query=new StringBuffer();
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO AND  ");
         query.append("     ");
         query.append("   MONTH(V.FECHA) = "+mm1+" AND  ");
         query.append("   YEAR(V.FECHA)=YEAR(NOW())  ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("  V.FECHA DESC  ");
         querys[HistoricoVentasDao.QUERY_VENTA_MENSUAL]=query;
         query=new StringBuffer();
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO AND  ");
         query.append("     ");
         query.append("     ");
         query.append("   YEAR(V.FECHA) = "+yyyy1+"  ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("  V.FECHA DESC  ");
         querys[HistoricoVentasDao.QUERY_VENTA_ANUAL]=query;
         query=new StringBuffer();
         query.append("   WHERE  ");
         query.append("   V.ID_USUARIO = U.ID_USUARIO  ");
         query.append("     ");
         query.append("     ");
         query.append("     ");
         query.append("     ");
         query.append("   ORDER BY  ");
         query.append("  V.FECHA DESC  ");
         querys[HistoricoVentasDao.QUERY_ALL_RECORDS]=query;
         query=new StringBuffer();
         return querys[criteria].toString();
    }
    /**
     * Se borran tanto el registro maestro de la venta, asi como sus registros detalle. la tablas son: ccn_historico_ventas/ccn_historico_ventas_detalle
     * @param conn es la conexion con la que trabaja el metodo
     * @param idVenta es el i de la venta, hay que recordar que la tabla ccn_historico_ventas es la maestro de : ccn_historico_ventas_detalle
     * @throws SQLException en caso de que la operacion no se haya efectuado.
     */
    public void deleteVentaID(Connection conn, int idVenta) throws SQLException
    {
    	StringBuffer query =new StringBuffer();
        query.append("   DELETE FROM ccn_historico_ventas_detalle  ");
        query.append("   WHERE id_venta=  ");
        query.append("   "+idVenta);
        StringBuffer query2 =new StringBuffer();
        query2.append("   DELETE FROM ccn_historico_ventas  ");
        query2.append("   WHERE id_venta=  ");
        query2.append("   "+idVenta);
		PreparedStatement pstmt=conn.prepareStatement(query.toString());
		pstmt.executeUpdate();
		pstmt.close();
		
		pstmt=conn.prepareStatement(query2.toString());
		pstmt.executeUpdate();
		pstmt.close();
		logger.info(query);
		logger.info(query2);
    	
    }
    
    /**
     * Consulta para obtener la lista de years de venta que hay en la BD
     * @param conn Es la conexion a la BD
     * @throws java.sql.SQLException Lanza la excepcion cuando no se pudo conectar a la base, o cuando no se pudo obtener un prepared statement
     * @return Un array list con la lista de Integers de todos los years que hay en la BD, por concepto de ventas
     */
    public java.util.ArrayList<String> getYearsVentas(Connection conn) throws java.sql.SQLException
    {
        StringBuffer query =new StringBuffer();
        query.append("   SELECT distinct year(fecha) year1  ");
        query.append("   FROM ccn_historico_ventas c  ");
        query.append("   order by year1;  ");

        ArrayList<String> arry=new ArrayList<String>();
        PreparedStatement pstmt=conn.prepareStatement(query.toString());
        ResultSet rs=pstmt.executeQuery();
        while(rs.next())
        {
            arry.add(new String(""+rs.getInt("year1")));
        }
        rs.close();
        pstmt.close();
        
        return arry;
    }
    
   
    public static void main(String[] args)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        for(int i=0;i>=0;++i)
        {
            System.out.println(""+sdf.format(new Date()));
        
        
        }
    
    }


}